/*
 * algoritmos.h
 *
 *  Created on: 28/09/2011
 *      Author: utn_so
 */

#ifndef ALGORITMOS_H_
#define ALGORITMOS_H_

extern char* handlerArchivoMapeado;
extern PPD_CHS posicionActualCabezal;
extern int32_t discoEstaSubiendo;

//Convierte de sector (como viene del RAID/PFS) a CHS (como entiende el planificador)
PPD_CHS ppd_LBAToCHS(int32_t sectorRecibido);

//Convierte de CHS a sector
int32_t ppd_CHStoLBA(PPD_CHS structRecibido);

//Agrega un pedido en la lista
void agregaPedidoEnLista(Nodo **lst, t_pedido pedidosAgregar);

//Agrega un pedido en la lista
void agregaPedidoEnListaOrdenada(Nodo **lst, t_pedido pedidosAgregar);

//Agrega un pedido en la lista para el nstep


//Arma el paquete para mandar
nipc armoNIPC(t_pedido pedido);

//Devuelve el tamaño de una lista
//int32_t tamanioLista(NodoNstep **lst);

//Borra un pedido de la lista
//void borrarPedidoProcesado(Nodo **lst, t_pedido pedidosAgregar);
void borrarPedidoProcesado(t_nodoCola **lst, t_pedido structObtenido);

//Inicializa la posicion actual con chs=0,0,0
//PPD_CHS cargoPosicionActualDisco(PPD_CHS estructuraRecibida);

PPD_CHS cargoPosActual(int32_t cilindro,int32_t sector);

t_pedido CargoLeoInformacion(t_pedido structDelProcesoObtenido);

//Algoritmo sstf
//t_pedido ppd_sstf(Nodo **lst,PPD_CHS posicionActualCabezal);
t_pedido ppd_sstf(Nodo **lst);

//Algoritmo nstepscan
//t_pedido ppd_nstepscan(NodoNstep **lst,PPD_CHS posicionActualCabezal);


PPD_CHS obtenerChsDesdeProceso(Nodo **lst,int32_t procesoID);

float tiempoEntreSectores(PPD_CHS sector1,PPD_CHS sector2);

int32_t diferenciaEntreSectores(PPD_CHS sector1,PPD_CHS sector2);

int32_t proximoSector(int32_t sector);

void ppd_info(int32_t sector);

int32_t ppd_clean(int32_t sector1,int32_t sector2);

int32_t ppd_cleanSector(int32_t sectorParaProcesar);

//void porQueSectoresPaso(int32_t sector1,int32_t sector2,PPD_CHS posicionActualCabezal);
void porQueSectoresPaso(int32_t sector1,int32_t sector2);

void ppd_trace1(int32_t sector,PPD_CHS posicionActualCabezal);

void ppd_trace2(int32_t sector1,int32_t sector2,PPD_CHS posicionActualCabezal);

void ppd_trace3(int32_t sector1,int32_t sector2,int32_t sector3,PPD_CHS posicionActualCabezal);

void ppd_trace4(int32_t sector1,int32_t sector2,int32_t sector3,int32_t sector4,PPD_CHS posicionActualCabezal);

void ppd_trace5(int32_t sector1,int32_t sector2,int32_t sector3,int32_t sector4,int32_t sector5,PPD_CHS posicionActualCabezal);

char* charLimpio();

int32_t *SectoresRecorro(PPD_CHS sectorAnterior, PPD_CHS sector);

void agregaPedidoEnListaNstep(NodoNstep **lst, t_pedido pedidosAgregar);

void borrarPedidoProcesadonstep(NodoNstep **lst);

t_pedido ppd_nstepScan(int32_t N);

t_pedido ppd_nstepScanProximoSector(int32_t N);

t_pedido mejorNstep(t_nodoCola * lstATrabajar, int32_t N);

t_pedido mejorNstepProximo(NodoNstep **lstGrande);


#endif /* ALGORITMOS_H_ */
